package com.yidu.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Service;

import com.yidu.common.Tools;
import com.yidu.dao.ListenFinanceDetailMapper;
import com.yidu.dao.ListenFinanceMapper;
import com.yidu.dao.ListenQualityTestingDetailMapper;
import com.yidu.dao.ListenQualityTestingMapper;
import com.yidu.dao.ListenRawstockRecordMapper;
import com.yidu.dao.ListenRawstockStockMapper;
import com.yidu.domain.ListenBackstageUser;
import com.yidu.domain.ListenFinance;
import com.yidu.domain.ListenFinanceDetail;
import com.yidu.domain.ListenQualityTesting;
import com.yidu.domain.ListenQualityTestingDetail;
import com.yidu.domain.ListenRawstockRecord;
import com.yidu.domain.ListenRawstockStock;
import com.yidu.service.ListenRawstockRecordService;
import com.yidu.service.ListenRawstockStockService;

/**
 * @title 材料库存Service实现类 
 * @author 江宇
 * @dateTime 2019年1月13日
 */
@Service
public class ListenRawstockStockServiceImpl  implements ListenRawstockStockService {
	
	@Resource
	ListenRawstockStockMapper dao;
	
	@Resource
	ListenRawstockRecordService rwstockRecordService;
	
	@Resource
	ListenQualityTestingDetailMapper qtdDao;
	
	@Resource
	ListenRawstockRecordMapper rrDao;

	@Resource
	ListenFinanceMapper finDao;
	
	@Resource
	ListenFinanceDetailMapper fdDao;
	
	@Resource
	ListenQualityTestingMapper qtDao;
	
	/**
     * @title 查询材料库存 
     * @param Map
     * @return List
     * @author 江宇
     * @dateTime 2018年11月29日
     * @versions 1.0
     */
	@Override
	public List<ListenRawstockStock> findRawstockStock(Map<String, Object> map) {
		 
		return dao.findRawstockStock(map);
	}

	/** 
     * @title 查询材料库存行数
     * @param Map
     * @return int
     * @author 江宇
     * @dateTime 2018年11月29日
     * @versions 1.0
     */
	@Override
	public int findRawstockStockCount(Map<String, Object> map) {
		 
		return dao.findRawstockStockCount(map);
	}
	
 
	 /**
     * @title 修改上屏
     * @param String
     * @return ListenRawstockStock
     * @author 江宇
     * @dateTime 2018年11月29日
     * @versions 1.0
     */
	@Override
	public ListenRawstockStock findRawstockStockId(String rsId) {
		
		return dao.selectByPrimaryKey(rsId);
	}
	
	
	/*public void addOrUpdateListRawstockRecord(ListenRawstockStock rs) {
		System.out.println("来了");
		ListenRawstockRecord rr=new ListenRawstockRecord();
		System.out.println("");
		rr.setRsId(rs.getRsId());
		rr.setRrNumber("+"+rs.getRawstockNumber());
		rr.setRrExplain("进购材料");
		rr.setRrName(rs.getRawstockName());
		rwstockRecordService.addOrUpdate(rr);
	}
	
	public void addOrUpdateListRawstockRecord(ListenRawstockStock rs,Integer number) {
		System.out.println("进来了");
		ListenRawstockRecord rr=new ListenRawstockRecord();
		rr.setRsId(rs.getRsId());
		if(number>rs.getRawstockNumber()) {
			rr.setRrNumber("-"+(number-rs.getRawstockNumber()));
			rr.setRrExplain("生产药品");
		}else {
			rr.setRrNumber("+"+(rs.getRawstockNumber()-number));
			rr.setRrExplain("进购材料");
		}
		
		rr.setRrName(rs.getRawstockName());
		rwstockRecordService.addOrUpdate(rr);
	}*/
	
	/**
     * @title 质检增加材料库存
     * @param String
     * @return int
     * @author 江宇
     * @dateTime 2018年11月29日
     * @versions 1.0
     */
	@Override
	public int qualityTestingadd(String qtId,String vocationalWorkId,HttpSession session) {
		//获取操作人的session
		ListenBackstageUser users = (ListenBackstageUser) session.getAttribute("user");
		int rows=0;
		//定义质检Map
		Map<String, Object> qtdMap=new HashMap<>();
		//质检ID赋值
		qtdMap.put("qtId", qtId);
		//调用查询质检明细的方法
		List<ListenQualityTestingDetail> qtdList=qtdDao.findQualityTestingDetail(qtdMap);
		//定义总金额变量
		double sumPrice=0;
		//定义总数量变量
		int sumNumber=0;
		//循环查询出的质检明细List集合
		for (ListenQualityTestingDetail listenQualityTestingDetail : qtdList) {
			//定义材料库存Map
			Map<String, Object> rsMap=new HashMap<>();
			//材料ID赋值
			rsMap.put("rawstockId", listenQualityTestingDetail.getVocationalWorkId());
			//调用查询材料库存的方法
			List<ListenRawstockStock> rsList=dao.findRawstockStock(rsMap);
			//循环查询出的材料库存List集合
			for (ListenRawstockStock listenRawstockStock : rsList) {
				 	//得到每个材料加入库存的数量(质检总数量-未通过数量)
					int purchaseNumber=listenQualityTestingDetail.getQtdNumber()-listenQualityTestingDetail.getQtdNoNumber();
					//得到加入库存的每个材料总数量
					int joinNumber=listenRawstockStock.getRawstockNumber()+purchaseNumber;
					//得到采购材料的总金额
					sumPrice=sumPrice+(purchaseNumber*listenRawstockStock.getRawstockPrice());
					//得到采购材料的总数量
					sumNumber=sumNumber+purchaseNumber;
					//创建材料库存类对象
					ListenRawstockStock rs2=new ListenRawstockStock();
					//材料库存数量赋值
					rs2.setRawstockNumber(joinNumber);
					//材料库存ID赋值
					rs2.setRsId(listenRawstockStock.getRsId());
					//调用修改材料库存的方法
					rows=dao.updateByPrimaryKeySelective(rs2);
					
					//创建材料库存记录类对象
					ListenRawstockRecord rr=new ListenRawstockRecord();
					//UUID主键
					rr.setRrId(Tools.getRandomString(32));
					//材料库存ID赋值
					rr.setRsId(listenRawstockStock.getRsId());
					//材料名称赋值
					rr.setRrName(listenRawstockStock.getRawstockName());
					//操作时间赋值
					rr.setRrTime(new Date());
					//材料数量赋值
					rr.setRrNumber("+"+purchaseNumber);
					//材料记录说明赋值
					rr.setRrExplain("进购材料");
					//是否有效赋值(有效)
					rr.setIsva(1);
					
					//调用增加材料库存距离的方法
					rows=rrDao.insertSelective(rr);
					
					
			 
			}
		}
		
		
		 	//调用跟根据公司ID查询财务的方法
			ListenFinance fin=finDao.findByCompanyId("1");
			
			//创建财务类对象
			ListenFinance fin2=new ListenFinance();
			//财务ID赋值
			fin2.setFinanceId(fin.getFinanceId());
			//财务金额赋值(当前财务金额减去采购材料的总金额)
			fin2.setCompanyPrice(fin.getCompanyPrice().subtract(BigDecimal.valueOf(sumPrice)));
			
			//调用修改财务的方法
			rows=finDao.updateByPrimaryKeySelective(fin2);
			
			//创建财务记录类对象
			ListenFinanceDetail fd=new ListenFinanceDetail();
			//UUID主键
			fd.setFdId(Tools.getRandomString(32));
			//财务ID赋值
			fd.setFinanceId(fin.getFinanceId());
			//操作时间赋值
			fd.setFdTime(new Date());
			//财务记录金额赋值(采购的材料总金额)
			fd.setFdPrice(BigDecimal.valueOf(sumPrice));
			//业务ID赋值(采购订单ID)
			fd.setVocationalWorkId(vocationalWorkId);
			//财务记录数量赋值(采购的材料总数量)
			fd.setFdNumber(sumNumber);
			//是否有效赋值(有效)
			fd.setIsva(1);
			//操作人赋值
			fd.setOper(users.getBuName());
			//支出类型(1总公司采购)
			fd.setSpendingtype(1);
			//支出说明
			fd.setSort("支出,采购材料");
			
			//调用增加财务记录的方法
			rows=fdDao.insertSelective(fd);
			
			//创建质检类对象
			ListenQualityTesting qt=new ListenQualityTesting();
			//质检ID赋值
			qt.setQtId(qtId);
			//质检状态赋值(3,已入库)
			qt.setQtStatus(3);
			
			//调用修改质检的方法
			rows=qtDao.updateByPrimaryKeySelective(qt);
		 
		return rows;
	}
	

}
